package api

import (
	"encoding/json"
	"io"
	"net/http"
	"time"

	"gitee.com/liumou_site/disk-monitoring/backend/internal/service"
	"github.com/gin-gonic/gin"
)

// DiskHandler 磁盘处理层结构体
type DiskHandler struct {
	diskService service.DiskService
}

// NewDiskHandler 创建磁盘处理层实例
func NewDiskHandler(diskService service.DiskService) *DiskHandler {
	return &DiskHandler{
		diskService: diskService,
	}
}

// GetDiskInfo 获取磁盘基本信息
// @Summary 获取磁盘基本信息
// @Description 获取系统中所有磁盘的基本信息和使用情况，包括总空间、已用空间、可用空间（已格式化为B、KB、MB、GB、TB）、使用率、挂载点、文件系统类型等完整静态数据
// @Tags 磁盘信息
// @Accept json
// @Produce json
// @Success 200 {array} model.DiskInfo "成功返回磁盘基本信息和使用情况列表" 
// @Failure 500 {object} map[string]interface{} "错误响应：{\"error\": \"错误描述\"}"
// @Router /api/disk/info [get]
func (h *DiskHandler) GetDiskInfo(c *gin.Context) {
	diskInfo, err := h.diskService.GetDiskInfo()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, diskInfo)
}

// GetDiskIOStats 获取磁盘IO统计信息
// @Summary 获取磁盘IO统计信息
// @Description 获取系统中所有磁盘的IO统计信息，包括读取总数、写入总数、读取字节数（格式化）、写入字节数（格式化）、进行中的IOPS、I/O时间（格式化）、加权I/O时间（格式化）等静态数据
// @Tags 磁盘信息
// @Accept json
// @Produce json
// @Success 200 {array} model.DiskIOStat "成功返回磁盘IO统计信息列表"
// @Failure 500 {object} map[string]interface{} "错误响应：{\"error\": \"错误描述\"}"
// @Router /api/disk/io [get]
func (h *DiskHandler) GetDiskIOStats(c *gin.Context) {
	diskIOStats, err := h.diskService.GetDiskIOStats()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, diskIOStats)
}

// GetRealTimeDiskIOData SSE方式获取实时磁盘IO数据
// @Summary SSE方式获取实时磁盘IO数据
// @Description 通过SSE方式实时推送磁盘IO性能数据，包括读取速度、写入速度、IOPS、延迟等实时性能指标，每秒更新一次
// @Tags 磁盘信息
// @Produce text/event-stream
// @Success 200 {object} model.RealTimeDiskIOData "SSE数据流：包含实时磁盘IO性能数据"
// @Failure 500 {object} map[string]interface{} "错误响应：{\"error\": \"错误描述\"}"
// @Router /api/disk/io/realtime [get]
func (h *DiskHandler) GetRealTimeDiskIOData(c *gin.Context) {
	// 设置SSE相关头部信息
	c.Header("Content-Type", "text/event-stream")
	c.Header("Cache-Control", "no-cache")
	c.Header("Connection", "keep-alive")
	c.Header("Access-Control-Allow-Origin", "*")

	// 创建一个定时器，每隔1秒发送一次数据
	ticker := time.NewTicker(1 * time.Second)
	defer ticker.Stop()

	// 监听客户端断开连接
	clientGone := c.Request.Context().Done()

	for {
		select {
		case <-clientGone:
			// 客户端断开连接，退出循环
			return
		case <-ticker.C:
			// 获取实时磁盘IO数据
			realTimeData, err := h.diskService.GetRealTimeDiskIOData()
			if err != nil {
				// 发送错误信息
				c.Stream(func(w io.Writer) bool {
					c.SSEvent("error", err.Error())
					return false
				})
				return
			}

			// 将数据转换为JSON格式
			data, err := json.Marshal(realTimeData)
			if err != nil {
				c.Stream(func(w io.Writer) bool {
					c.SSEvent("error", err.Error())
					return false
				})
				return
			}

			// 发送数据给客户端
			c.Stream(func(w io.Writer) bool {
				c.SSEvent("message", string(data))
				return true
			})

			// 确保数据被发送
			c.Writer.Flush()
		}
	}
}
